package org.ysu.shoeShopping.service.impl;

import org.ysu.shoeShopping.dto.CartItem;
import org.ysu.shoeShopping.entity.Cart;
import org.ysu.shoeShopping.entity.Shoes;
import org.ysu.shoeShopping.dao.CartDao;
import org.ysu.shoeShopping.service.CartService;
import org.ysu.shoeShopping.service.ShoesService;
import org.ysu.shoeShopping.service.MinioFileService;
import org.springframework.stereotype.Service;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.PageRequest;

import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

/**
 * 购物车(Cart)表服务实现类
 *
 * @author makejava
 * @since 2025-09-21 15:21:54
 */
@Service("cartService")
public class CartServiceImpl implements CartService {
    @Resource
    private CartDao cartDao;

    @Resource
    private ShoesService shoesService;

    @Resource
    private MinioFileService minioFileService;

    /**
     * 通过ID查询单条数据
     *
     * @param id 主键
     * @return 实例对象
     */
    @Override
    public Cart queryById(Integer id) {
        return this.cartDao.queryById(id);
    }

    /**
     * 分页查询
     *
     * @param cart 筛选条件
     * @param pageRequest 分页对象
     * @return 查询结果
     */
    @Override
    public Page<Cart> queryByPage(Cart cart, PageRequest pageRequest) {
        long total = this.cartDao.count(cart);
        return new PageImpl<>(this.cartDao.queryAllByLimit(cart, pageRequest), pageRequest, total);
    }

    /**
     * 新增数据
     *
     * @param cart 实例对象
     * @return 实例对象
     */
    @Override
    public Cart insert(Cart cart) {
        this.cartDao.insert(cart);
        return cart;
    }

    /**
     * 修改数据
     *
     * @param cart 实例对象
     * @return 实例对象
     */
    @Override
    public Cart update(Cart cart) {
        this.cartDao.update(cart);
        return this.queryById(cart.getId());
    }

    /**
     * 通过主键删除数据
     *
     * @param id 主键
     * @return 是否成功
     */
    @Override
    public boolean deleteById(Integer id) {
        return this.cartDao.deleteById(id) > 0;
    }

    /**
     * 根据用户ID获取购物车商品列表
     *
     * @param userId 用户ID
     * @return 购物车商品列表
     */
    @Override
    public List<CartItem> getCartItems(Integer userId) {
        List<CartItem> cartItems = new ArrayList<>();
        List<Cart> carts = cartDao.queryByUserId(userId);

        for (Cart cart : carts) {
            // 查询鞋子详细信息
            Shoes shoes = shoesService.queryById(cart.getSid());
            if (shoes != null) {
                CartItem cartItem = new CartItem();
                cartItem.setId(cart.getId());
                cartItem.setName(shoes.getSname());

                // 根据sizeid获取实际的尺码值，这里暂时使用sizeid，后续可以通过sizes表获取实际尺码
                cartItem.setSize(cart.getSizeid() != null ? cart.getSizeid().toString() : "");
                cartItem.setPrice(new BigDecimal(shoes.getSdiscount().toString()));
                cartItem.setQuantity(cart.getQuantity());
                cartItem.setPoints(0); // 购物车表中没有积分字段，设为0

                // 生成MinIO图片URL
                if (shoes.getSimage() != null && !shoes.getSimage().isEmpty()) {
                    try {
                        String imageUrl = minioFileService.getFileUrl(shoes.getSimage());
                        cartItem.setImage(imageUrl);
                    } catch (Exception e) {
                        // 如果获取图片URL失败，设置为空字符串
                        cartItem.setImage("");
                    }
                }

                cartItems.add(cartItem);
            }
        }

        return cartItems;
    }

    /**
     * 添加商品到购物车
     *
     * @param userId 用户ID
     * @param sid 商品ID
     * @param sizeid 尺码ID
     * @param quantity 数量
     * @return 是否成功
     */
    @Override
    public boolean addToCart(Integer userId, Integer sid, Integer sizeid, Integer quantity) {
        try {
            // 检查是否已存在相同商品和尺码
            Cart existingCart = cartDao.findByUserIdAndSidAndSizeid(userId, sid, sizeid);

            if (existingCart != null) {
                // 如果存在，更新数量
                int newQuantity = existingCart.getQuantity() + quantity;
                return cartDao.updateQuantity(existingCart.getId(), newQuantity) > 0;
            } else {
                // 如果不存在，新增记录
                Cart cart = new Cart();
                cart.setUserId(userId);
                cart.setSid(sid);
                cart.setSizeid(sizeid);
                cart.setQuantity(quantity);
                cart.setSelected(true); // 默认选中

                return cartDao.insert(cart) > 0;
            }
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 更新购物车商品数量
     *
     * @param cartId 购物车ID
     * @param quantity 新数量
     * @return 是否成功
     */
    @Override
    public boolean updateCartQuantity(Integer cartId, Integer quantity) {
        try {
            if (quantity <= 0) {
                // 如果数量为0或负数，删除该项
                return this.deleteById(cartId);
            } else {
                return cartDao.updateQuantity(cartId, quantity) > 0;
            }
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 从购物车移除商品
     *
     * @param cartId 购物车ID
     * @return 是否成功
     */
    @Override
    public boolean removeFromCart(Integer cartId) {
        return this.deleteById(cartId);
    }

    /**
     * 清空用户购物车
     *
     * @param userId 用户ID
     * @return 是否成功
     */
    @Override
    public boolean clearCart(Integer userId) {
        try {
            return cartDao.deleteByUserId(userId) >= 0; // 即使删除0行也认为成功
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
}